This is a document describing Kara’s initial exploration of the data from Packets 1-3 (!!!).

Setup

Look at differences by site

d_long_subscale_boot <- d_long_subscale %>%
  filter(!is.na(sum_score)) %>%
  group_by(ctry, packet, subscale) %>%
  do(data.frame(rbind(smean.cl.boot(.$sum_score)))) %>%
  ungroup() %>%
  filter(subscale != "attn") %>%
  left_join(d_long_subscale %>%
              filter(!is.na(sum_score)) %>%
              count(ctry, packet, subscale)) %>%
  mutate(packet = paste("packet", packet),
         ctry = factor(ctry,
                       levels = c("us", "ghana", 
                                  "thailand", "china", "vanuatu")))
Joining, by = c("ctry", "packet", "subscale")
ggplot(d_long_subscale_boot %>% 
         mutate(packet = gsub("packet ", "P", packet)),
       aes(x = ctry, y = Mean, color = ctry)) +
  facet_wrap(~ reorder(interaction(packet, subscale, sep = ": "), 
                       as.numeric(factor(packet))), 
             ncol = 5, scales = "free") +
  geom_pointrange(aes(ymin = Lower, ymax = Upper)) +
  geom_text(aes(label = paste0("(n=", n, ")"), y = Lower), 
            size = 2, nudge_x = 0.15, hjust = 0) +
  scale_x_discrete(expand = c(0, 1)) +
  scale_color_brewer(palette = "Dark2") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1),
        legend.position = "top") +
  labs(title = "mean scores by site",
       subtitle = "ordered by packet (P1, P2, P3)\nerror bars are bootstrapped 95% confidence intervals",
       x = "site", color = "site",
       y = "mean score (range varies by subscale)")

Look at correlations among subscales by site

d_long_subscale_boot %>%
  mutate(subscale = ifelse(grepl("invo_hardy_bentall", subscale),
                           paste(subscale,
                                 gsub("packet ", "p", packet),
                                 sep = "_"),
                           subscale)) %>%
  distinct(ctry, subscale, Mean) %>%
  ungroup() %>%
  spread(subscale, Mean) %>%
  data.frame() %>%
  column_to_rownames("ctry") %>%
  cor() %>%
  data.frame() %>%
  rownames_to_column("subscaleA") %>%
  gather(subscaleB, cor, -subscaleA) %>%
  ggplot(aes(x = subscaleA, y = subscaleB, fill = cor, label = round2(cor))) +
  geom_tile() +
  geom_text(size = 3) +
  scale_fill_distiller(guide = guide_colorbar(barheight = 6),
                       palette = "RdYlBu", limits = c(-1, 1)) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(title = "correlations among mean subscale scores, by site",
       x = "",
       y = "")

Cluster analysis

cor_by_site <- d_long_subscale_boot %>%
  mutate(subscale = ifelse(grepl("invo_hardy_bentall", subscale),
                           paste(subscale,
                                 gsub("packet ", "p", packet),
                                 sep = "_"),
                           subscale)) %>%
  distinct(ctry, subscale, Mean) %>%
  filter(subscale != "invo_hardy_bentall_p3") %>%
  ungroup() %>%
  spread(subscale, Mean) %>%
  data.frame() %>%
  column_to_rownames("ctry")

… of subscales

clust_subscales <- hclust(dist(t(cor_by_site)))
ggdendrogram(clust_subscales) +
  labs(title = "hierarchical cluster of subscales",
       subtitle = "using mean subscale scores by site")

… of sites

clust_subscales <- hclust(dist(cor_by_site))
ggdendrogram(clust_subscales) +
  labs(title = "hierarchical cluster of sites",
       subtitle = "using mean subscale scores by site")

Look at correlations among subscales by individuals

Packet 1

d_long_subscale %>%
  filter(packet == 1, !is.na(sum_score)) %>%
  spread(subscale, sum_score) %>%
  select(-c(ctry, wher, recr, whoc, attn)) %>%
  mutate(subj = paste(subj, packet, version, sep = "_")) %>%
  select(-packet, -version) %>%
  distinct() %>%
  remove_rownames() %>%
  column_to_rownames("subj") %>%
  cor(use = "pairwise.complete.obs") %>%
  data.frame() %>%
  rownames_to_column("subscaleA") %>%
  gather(subscaleB, cor, -subscaleA) %>%
  ggplot(aes(x = subscaleA, y = subscaleB, fill = cor, label = round2(cor))) +
  geom_tile() +
  geom_text(size = 3) +
  scale_fill_distiller(guide = guide_colorbar(barheight = 6),
                       palette = "RdYlBu", limits = c(-1, 1)) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(title = "PACKET 1: correlations among subscales",
       subtitle = "using pairwise complete observations",
       x = "",
       y = "")
Setting row names on a tibble is deprecated.

Packet 2

d_long_subscale %>%
  filter(packet == 2, !is.na(sum_score)) %>%
  spread(subscale, sum_score) %>%
  select(-c(ctry, wher, recr, whoc, attn)) %>%
  mutate(subj = paste(subj, packet, version, sep = "_")) %>%
  select(-packet, -version) %>%
  distinct() %>%
  remove_rownames() %>%
  column_to_rownames("subj") %>%
  cor(use = "pairwise.complete.obs") %>%
  data.frame() %>%
  rownames_to_column("subscaleA") %>%
  gather(subscaleB, cor, -subscaleA) %>%
  ggplot(aes(x = subscaleA, y = subscaleB, fill = cor, label = round2(cor))) +
  geom_tile() +
  geom_text(size = 3) +
  scale_fill_distiller(guide = guide_colorbar(barheight = 6),
                       palette = "RdYlBu", limits = c(-1, 1)) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(title = "PACKET 2: correlations among subscales",
       subtitle = "using pairwise complete observations",
       x = "",
       y = "")
Setting row names on a tibble is deprecated.

Packet 3

d_long_subscale %>%
  filter(packet == 3, !is.na(sum_score)) %>%
  spread(subscale, sum_score) %>%
  select(-c(ctry, wher, recr, whoc, attn)) %>%
  mutate(subj = paste(subj, packet, version, sep = "_")) %>%
  select(-packet, -version) %>%
  distinct() %>%
  remove_rownames() %>%
  column_to_rownames("subj") %>%
  cor(use = "pairwise.complete.obs") %>%
  data.frame() %>%
  rownames_to_column("subscaleA") %>%
  gather(subscaleB, cor, -subscaleA) %>%
  ggplot(aes(x = subscaleA, y = subscaleB, fill = cor, label = round2(cor))) +
  geom_tile() +
  geom_text(size = 3) +
  scale_fill_distiller(guide = guide_colorbar(barheight = 6),
                       palette = "RdYlBu", limits = c(-1, 1)) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(title = "PACKET 3: correlations among subscales",
       subtitle = "using pairwise complete observations",
       x = "",
       y = "")
Setting row names on a tibble is deprecated.

All packets

Note that some of these pairs of subscales probably have very few observations going into these correlations! Take this with a grain of salt.

d_long_subscale %>%
  spread(subscale, sum_score) %>%
  select(-c(ctry, wher, recr, whoc, attn)) %>%
  mutate(subj = paste(subj, packet, version, sep = "_")) %>%
  select(-packet, -version) %>%
  distinct() %>%
  remove_rownames() %>%
  column_to_rownames("subj") %>%
  cor(use = "pairwise.complete.obs") %>%
  data.frame() %>%
  rownames_to_column("subscaleA") %>%
  gather(subscaleB, cor, -subscaleA) %>%
  ggplot(aes(x = subscaleA, y = subscaleB, fill = cor, label = round2(cor))) +
  geom_tile() +
  geom_text(size = 3) +
  scale_fill_distiller(guide = guide_colorbar(barheight = 6),
                       palette = "RdYlBu", limits = c(-1, 1)) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(title = "PACKETS 1-3: correlations among subscales",
       subtitle = "using pairwise complete observations",
       x = "",
       y = "")
Setting row names on a tibble is deprecated.

LS0tCnRpdGxlOiAnU0MgZGF0YSBlbnRyeTogUGFja2V0cyAxLTMnCnN1YnRpdGxlOiAnS1cgaW5pdGlhbCBleHBsb3JhdGlvbiAodXBkYXRlZCB3aXRoIGRhdGEgZnJvbSAyMDE4LTAxLTMxKScKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKVGhpcyBpcyBhIGRvY3VtZW50IGRlc2NyaWJpbmcgS2FyYSdzIGluaXRpYWwgZXhwbG9yYXRpb24gb2YgdGhlIGRhdGEgZnJvbSBQYWNrZXRzIDEtMyAoISEhKS4KCiMgU2V0dXAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CiMgc2V0IHdvcmtpbmcgZGlyZWN0b3IKIyBzZXR3ZCgiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy90ZW1wbGV0b25fcGFja2V0cy9wYWNrZXRzMTIzLyIpCgojIGxvYWQgcGFja2FnZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocm1zKQpsaWJyYXJ5KGdnZGVuZHJvKQoKIyBsb2FkIHF1ZXN0aW9uIGtleSAoaW5jbHVkaW5nIG1hbnVhbCByZXZlcnNlLWNvZGluZykKcXVlc3Rpb25fa2V5IDwtIHJlYWQuY3N2KCIvL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy90ZW1wbGV0b25fcGFja2V0cy9wYWNrZXRzMTIzL3BhY2tldHMxMjNfcXVlc3Rpb25fa2V5X2J5aGFuZC5jc3YiKQoKIyBsb2FkIGRhdGEKZF93aWRlIDwtIHJlYWRfY3N2KCIuL3BhY2tldHMxMjNfZGF0YV9ieXF1ZXN0aW9uX3dpZGUuY3N2IikKZF93aWRlX3N1YnNjYWxlIDwtIHJlYWRfY3N2KCIuL3BhY2tldHMxMjNfZGF0YV9ieXN1YnNjYWxlX3dpZGUuY3N2IikKZF9sb25nIDwtIHJlYWRfY3N2KCIuL3BhY2tldHMxMjNfZGF0YV9ieXF1ZXN0aW9uX2xvbmcuY3N2IikKZF9sb25nX3N1YnNjYWxlIDwtIHJlYWRfY3N2KCIuL3BhY2tldHMxMjNfZGF0YV9ieXN1YnNjYWxlX2xvbmcuY3N2IikKCiMgbWFrZSBjdXN0b20gZnVuY3Rpb25zCnJvdW5kMiA8LSBmdW5jdGlvbih4KSB7Zm9ybWF0KHJvdW5kKHgsIDIpLCBkaWdpdHMgPSAyKX0KYGBgCgojIExvb2sgYXQgZGlmZmVyZW5jZXMgYnkgc2l0ZQoKYGBge3J9CmRfbG9uZ19zdWJzY2FsZV9ib290IDwtIGRfbG9uZ19zdWJzY2FsZSAlPiUKICBmaWx0ZXIoIWlzLm5hKHN1bV9zY29yZSkpICU+JQogIGdyb3VwX2J5KGN0cnksIHBhY2tldCwgc3Vic2NhbGUpICU+JQogIGRvKGRhdGEuZnJhbWUocmJpbmQoc21lYW4uY2wuYm9vdCguJHN1bV9zY29yZSkpKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcihzdWJzY2FsZSAhPSAiYXR0biIpICU+JQogIGxlZnRfam9pbihkX2xvbmdfc3Vic2NhbGUgJT4lCiAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShzdW1fc2NvcmUpKSAlPiUKICAgICAgICAgICAgICBjb3VudChjdHJ5LCBwYWNrZXQsIHN1YnNjYWxlKSkgJT4lCiAgbXV0YXRlKHBhY2tldCA9IHBhc3RlKCJwYWNrZXQiLCBwYWNrZXQpLAogICAgICAgICBjdHJ5ID0gZmFjdG9yKGN0cnksCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFpbGFuZCIsICJjaGluYSIsICJ2YW51YXR1IikpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA3LCBmaWcuYXNwID0gMS4zfQpnZ3Bsb3QoZF9sb25nX3N1YnNjYWxlX2Jvb3QgJT4lIAogICAgICAgICBtdXRhdGUocGFja2V0ID0gZ3N1YigicGFja2V0ICIsICJQIiwgcGFja2V0KSksCiAgICAgICBhZXMoeCA9IGN0cnksIHkgPSBNZWFuLCBjb2xvciA9IGN0cnkpKSArCiAgZmFjZXRfd3JhcCh+IHJlb3JkZXIoaW50ZXJhY3Rpb24ocGFja2V0LCBzdWJzY2FsZSwgc2VwID0gIjogIiksIAogICAgICAgICAgICAgICAgICAgICAgIGFzLm51bWVyaWMoZmFjdG9yKHBhY2tldCkpKSwgCiAgICAgICAgICAgICBuY29sID0gNSwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlcikpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpLCB5ID0gTG93ZXIpLCAKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3ggPSAwLjE1LCBoanVzdCA9IDApICsKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwgMSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsKICBsYWJzKHRpdGxlID0gIm1lYW4gc2NvcmVzIGJ5IHNpdGUiLAogICAgICAgc3VidGl0bGUgPSAib3JkZXJlZCBieSBwYWNrZXQgKFAxLCBQMiwgUDMpXG5lcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIiwKICAgICAgIHggPSAic2l0ZSIsIGNvbG9yID0gInNpdGUiLAogICAgICAgeSA9ICJtZWFuIHNjb3JlIChyYW5nZSB2YXJpZXMgYnkgc3Vic2NhbGUpIikKYGBgCgojIExvb2sgYXQgY29ycmVsYXRpb25zIGFtb25nIHN1YnNjYWxlcyBieSBzaXRlCgpgYGB7ciwgZmlnLndpZHRoID0gNywgZmlnLmFzcCA9IDF9CmRfbG9uZ19zdWJzY2FsZV9ib290ICU+JQogIG11dGF0ZShzdWJzY2FsZSA9IGlmZWxzZShncmVwbCgiaW52b19oYXJkeV9iZW50YWxsIiwgc3Vic2NhbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZShzdWJzY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigicGFja2V0ICIsICJwIiwgcGFja2V0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIl8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NhbGUpKSAlPiUKICBkaXN0aW5jdChjdHJ5LCBzdWJzY2FsZSwgTWVhbikgJT4lCiAgdW5ncm91cCgpICU+JQogIHNwcmVhZChzdWJzY2FsZSwgTWVhbikgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiY3RyeSIpICU+JQogIGNvcigpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YnNjYWxlQSIpICU+JQogIGdhdGhlcihzdWJzY2FsZUIsIGNvciwgLXN1YnNjYWxlQSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc3Vic2NhbGVBLCB5ID0gc3Vic2NhbGVCLCBmaWxsID0gY29yLCBsYWJlbCA9IHJvdW5kMihjb3IpKSkgKwogIGdlb21fdGlsZSgpICsKICBnZW9tX3RleHQoc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDYpLAogICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gImNvcnJlbGF0aW9ucyBhbW9uZyBtZWFuIHN1YnNjYWxlIHNjb3JlcywgYnkgc2l0ZSIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIiIpCmBgYAoKIyBDbHVzdGVyIGFuYWx5c2lzCgpgYGB7cn0KY29yX2J5X3NpdGUgPC0gZF9sb25nX3N1YnNjYWxlX2Jvb3QgJT4lCiAgbXV0YXRlKHN1YnNjYWxlID0gaWZlbHNlKGdyZXBsKCJpbnZvX2hhcmR5X2JlbnRhbGwiLCBzdWJzY2FsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKHN1YnNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJwYWNrZXQgIiwgInAiLCBwYWNrZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiXyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY2FsZSkpICU+JQogIGRpc3RpbmN0KGN0cnksIHN1YnNjYWxlLCBNZWFuKSAlPiUKICBmaWx0ZXIoc3Vic2NhbGUgIT0gImludm9faGFyZHlfYmVudGFsbF9wMyIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzcHJlYWQoc3Vic2NhbGUsIE1lYW4pICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoImN0cnkiKQpgYGAKCiMjIC4uLiBvZiBzdWJzY2FsZXMKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC42fQpjbHVzdF9zdWJzY2FsZXMgPC0gaGNsdXN0KGRpc3QodChjb3JfYnlfc2l0ZSkpKQpnZ2RlbmRyb2dyYW0oY2x1c3Rfc3Vic2NhbGVzKSArCiAgbGFicyh0aXRsZSA9ICJoaWVyYXJjaGljYWwgY2x1c3RlciBvZiBzdWJzY2FsZXMiLAogICAgICAgc3VidGl0bGUgPSAidXNpbmcgbWVhbiBzdWJzY2FsZSBzY29yZXMgYnkgc2l0ZSIpCmBgYAoKIyMgLi4uIG9mIHNpdGVzCgpgYGB7ciwgZmlnLndpZHRoID0gMiwgZmlnLmFzcCA9IDAuNn0KY2x1c3Rfc3Vic2NhbGVzIDwtIGhjbHVzdChkaXN0KGNvcl9ieV9zaXRlKSkKZ2dkZW5kcm9ncmFtKGNsdXN0X3N1YnNjYWxlcykgKwogIGxhYnModGl0bGUgPSAiaGllcmFyY2hpY2FsIGNsdXN0ZXIgb2Ygc2l0ZXMiLAogICAgICAgc3VidGl0bGUgPSAidXNpbmcgbWVhbiBzdWJzY2FsZSBzY29yZXMgYnkgc2l0ZSIpCmBgYAoKIyBMb29rIGF0IGNvcnJlbGF0aW9ucyBhbW9uZyBzdWJzY2FsZXMgYnkgaW5kaXZpZHVhbHMKCiMjIFBhY2tldCAxCgpgYGB7ciBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMX0KZF9sb25nX3N1YnNjYWxlICU+JQogIGZpbHRlcihwYWNrZXQgPT0gMSwgIWlzLm5hKHN1bV9zY29yZSkpICU+JQogIHNwcmVhZChzdWJzY2FsZSwgc3VtX3Njb3JlKSAlPiUKICBzZWxlY3QoLWMoY3RyeSwgd2hlciwgcmVjciwgd2hvYywgYXR0bikpICU+JQogIG11dGF0ZShzdWJqID0gcGFzdGUoc3ViaiwgcGFja2V0LCB2ZXJzaW9uLCBzZXAgPSAiXyIpKSAlPiUKICBzZWxlY3QoLXBhY2tldCwgLXZlcnNpb24pICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJqIikgJT4lCiAgY29yKHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJzY2FsZUEiKSAlPiUKICBnYXRoZXIoc3Vic2NhbGVCLCBjb3IsIC1zdWJzY2FsZUEpICU+JQogIGdncGxvdChhZXMoeCA9IHN1YnNjYWxlQSwgeSA9IHN1YnNjYWxlQiwgZmlsbCA9IGNvciwgbGFiZWwgPSByb3VuZDIoY29yKSkpICsKICBnZW9tX3RpbGUoKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA2KSwKICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQQUNLRVQgMTogY29ycmVsYXRpb25zIGFtb25nIHN1YnNjYWxlcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJ1c2luZyBwYWlyd2lzZSBjb21wbGV0ZSBvYnNlcnZhdGlvbnMiLAogICAgICAgeCA9ICIiLAogICAgICAgeSA9ICIiKQpgYGAKCiMjIFBhY2tldCAyCgpgYGB7ciBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMX0KZF9sb25nX3N1YnNjYWxlICU+JQogIGZpbHRlcihwYWNrZXQgPT0gMiwgIWlzLm5hKHN1bV9zY29yZSkpICU+JQogIHNwcmVhZChzdWJzY2FsZSwgc3VtX3Njb3JlKSAlPiUKICBzZWxlY3QoLWMoY3RyeSwgd2hlciwgcmVjciwgd2hvYywgYXR0bikpICU+JQogIG11dGF0ZShzdWJqID0gcGFzdGUoc3ViaiwgcGFja2V0LCB2ZXJzaW9uLCBzZXAgPSAiXyIpKSAlPiUKICBzZWxlY3QoLXBhY2tldCwgLXZlcnNpb24pICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJqIikgJT4lCiAgY29yKHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJzY2FsZUEiKSAlPiUKICBnYXRoZXIoc3Vic2NhbGVCLCBjb3IsIC1zdWJzY2FsZUEpICU+JQogIGdncGxvdChhZXMoeCA9IHN1YnNjYWxlQSwgeSA9IHN1YnNjYWxlQiwgZmlsbCA9IGNvciwgbGFiZWwgPSByb3VuZDIoY29yKSkpICsKICBnZW9tX3RpbGUoKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA2KSwKICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQQUNLRVQgMjogY29ycmVsYXRpb25zIGFtb25nIHN1YnNjYWxlcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJ1c2luZyBwYWlyd2lzZSBjb21wbGV0ZSBvYnNlcnZhdGlvbnMiLAogICAgICAgeCA9ICIiLAogICAgICAgeSA9ICIiKQpgYGAKCiMjIFBhY2tldCAzCgpgYGB7ciBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMX0KZF9sb25nX3N1YnNjYWxlICU+JQogIGZpbHRlcihwYWNrZXQgPT0gMywgIWlzLm5hKHN1bV9zY29yZSkpICU+JQogIHNwcmVhZChzdWJzY2FsZSwgc3VtX3Njb3JlKSAlPiUKICBzZWxlY3QoLWMoY3RyeSwgd2hlciwgcmVjciwgd2hvYywgYXR0bikpICU+JQogIG11dGF0ZShzdWJqID0gcGFzdGUoc3ViaiwgcGFja2V0LCB2ZXJzaW9uLCBzZXAgPSAiXyIpKSAlPiUKICBzZWxlY3QoLXBhY2tldCwgLXZlcnNpb24pICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJqIikgJT4lCiAgY29yKHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJzY2FsZUEiKSAlPiUKICBnYXRoZXIoc3Vic2NhbGVCLCBjb3IsIC1zdWJzY2FsZUEpICU+JQogIGdncGxvdChhZXMoeCA9IHN1YnNjYWxlQSwgeSA9IHN1YnNjYWxlQiwgZmlsbCA9IGNvciwgbGFiZWwgPSByb3VuZDIoY29yKSkpICsKICBnZW9tX3RpbGUoKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA2KSwKICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQQUNLRVQgMzogY29ycmVsYXRpb25zIGFtb25nIHN1YnNjYWxlcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJ1c2luZyBwYWlyd2lzZSBjb21wbGV0ZSBvYnNlcnZhdGlvbnMiLAogICAgICAgeCA9ICIiLAogICAgICAgeSA9ICIiKQpgYGAKCiMjIEFsbCBwYWNrZXRzCgoqTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgcGFpcnMgb2Ygc3Vic2NhbGVzIHByb2JhYmx5IGhhdmUgdmVyeSBmZXcgb2JzZXJ2YXRpb25zIGdvaW5nIGludG8gdGhlc2UgY29ycmVsYXRpb25zISBUYWtlIHRoaXMgd2l0aCBhIGdyYWluIG9mIHNhbHQuKgoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAxfQpkX2xvbmdfc3Vic2NhbGUgJT4lCiAgc3ByZWFkKHN1YnNjYWxlLCBzdW1fc2NvcmUpICU+JQogIHNlbGVjdCgtYyhjdHJ5LCB3aGVyLCByZWNyLCB3aG9jLCBhdHRuKSkgJT4lCiAgbXV0YXRlKHN1YmogPSBwYXN0ZShzdWJqLCBwYWNrZXQsIHZlcnNpb24sIHNlcCA9ICJfIikpICU+JQogIHNlbGVjdCgtcGFja2V0LCAtdmVyc2lvbikgJT4lCiAgZGlzdGluY3QoKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmoiKSAlPiUKICBjb3IodXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YnNjYWxlQSIpICU+JQogIGdhdGhlcihzdWJzY2FsZUIsIGNvciwgLXN1YnNjYWxlQSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc3Vic2NhbGVBLCB5ID0gc3Vic2NhbGVCLCBmaWxsID0gY29yLCBsYWJlbCA9IHJvdW5kMihjb3IpKSkgKwogIGdlb21fdGlsZSgpICsKICBnZW9tX3RleHQoc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDYpLAogICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBBQ0tFVFMgMS0zOiBjb3JyZWxhdGlvbnMgYW1vbmcgc3Vic2NhbGVzIiwKICAgICAgIHN1YnRpdGxlID0gInVzaW5nIHBhaXJ3aXNlIGNvbXBsZXRlIG9ic2VydmF0aW9ucyIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIiIpCmBgYAo=